#include "stackapp.h"

/**
 * 功 能：
 *      判断是否为 左 符号
 * 参 数：
 *      ch:要判断的字符
 * 返回值：
 *      成功：true
 *      失败：false
 **/
bool StackApp_isLeft(char ch)
{
    bool ret = false;

    switch (ch)
    {
    case '<':
    case '(':
    case '[':
    case '{':
        ret = true;
        break;
    default:
        break;
    }
    return ret;
}
/**
 * 功 能：
 *      判断是否为 右 符号
 * 参 数：
 *      ch:要判断的字符
 * 返回值：
 *      成功：true
 *      失败：false
 **/
bool StackApp_isRight(char ch)
{
    bool ret = false;

    switch (ch)
    {
    case '>':
    case ')':
    case ']':
    case '}':
        ret = true;
        break;
    default:
        break;
    }

    return ret;
}
/**
 * 功 能：
 *      判断是否左符号和右符号是否匹配
 * 参 数：
 *      lch:要判断的左字符
 *      rch:要判断的右字符
 * 返回值：
 *      成功：true
 *      失败：false
 **/
bool StackApp_Match(char lch, char rch)
{
    bool ret = false;

    switch (lch)
    {
    case '<':
        ret = (rch == '>');
        break;
    case '(':
        ret = (rch == ')');
        break;
    case '[':
        ret = (rch == ']');
        break;
    case '{':
        ret = (rch == '}');
        break;
    default:
        break;
    }

    return !ret;
}

int StackApp_Run(const char *str)
{
    char *tmp = (char *)str;
    int ret = true;

    LinkStack *stack = fun_LinkStack.create();

    while (*tmp != '\0')
    {
        if (StackApp_isLeft(*tmp) == true)
        {
            fun_LinkStack.push(stack, (LinkStackNode *)(tmp));
        }
        else if (StackApp_isRight(*tmp) == true)
        {
            char *ch = (char *)fun_LinkStack.pop(stack);
            if (ch == NULL || StackApp_Match(*ch, *tmp) == false)
            {
                printf("%c does not matched!\n", *tmp);
                ret = false;
            }
        }
        tmp++;
    }

    if (fun_LinkStack.length(stack) == 0 && *tmp == '\0' && ret == true)
    {
        printf("successed\n");
        ret = true;
    }
    else
    {
        printf("Invalid!\n");
        ret = false;
    }

    fun_LinkStack.destroy(stack);

    return ret;
}

func_StackApp fun_StackApp = {
    StackApp_Run};
